// 定义一个抽象类，来统一冲泡饮料的步骤
export abstract class Beverage {
  // 1. 烧水，因为无论是冲泡咖啡还是茶，烧水的实现都是相同
  // 因此这个方法的具体实现就可以写在父类里面
  boildWater() {
    console.log("把水烧开");
  }

  abstract brew(): void; // 2. 泡饮料，因为冲泡的方式不同，所以交给子类去实现
  abstract pourInCup(): void; // 3. 把饮料倒进杯子，因为倒的是不同的饮料，所以交给子类去实现
  abstract addCondiments(): void; // 4. 加调料，因为调料不同，所以交给子类去实现

  // 5. 模板方法，控制泡饮料的流程（重要）
  init(): void {
    this.boildWater();
    this.brew();
    this.pourInCup();
    // 这里第 4 个步骤是一个钩子，子类可以选择是否覆盖这个方法
    if (this.customerWantsCondiments()) {
      // 只有在 customerWantsCondiments 这个方法返回 true 的时候，才会执行步骤 4 
      this.addCondiments();
    }
  }

  // 顾客是否需要调料，子类可以覆盖这个方法，来决定是否需要调料
  customerWantsCondiments(): boolean {
    return true;
  }
}
